/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xml;

import datos.Programacion;
import java.util.List;
import java.io.StringWriter;
import java.net.URL;
import java.text.SimpleDateFormat;
import javax.naming.Context;
import javax.naming.InitialContext;
import org.w3c.dom.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.*;
import javax.xml.transform.stream.*;
import negocio.GestorFotosLocal;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;

/**
 *
 * @author Ing. Monica Merlo, Ing. Agustin  Fernandez
 */
public class XmlMovil {

    static Logger logger = Logger.getLogger(XmlMovil.class);

    public static void log4jArchivo (Exception e){
        /**
         * Primero obtenemos la url del archivo de configuración,
         * como están en el mismo paquete que la clase Main lo podemos obtener con el método getResource().
         */
        URL url = XmlMovil.class.getResource("/configuracion/log4j.properties");
        /**
         * Despues cargamos el archivo de configuración
         */
        PropertyConfigurator.configure(url);
        logger.error(e);
    }

    /***
     * Método que transforma un listado de obras en un xml bien formado y lo devuelve
     * como string utilizado por el movil.
     * @param obras el listado de obras a transformar en xml
     * @return devuelve un xml en formato de string
     */
    public static String obrasToXmlToString(List<datos.Obra> obras) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            DOMImplementation implementation = builder.getDOMImplementation();
            Document document = (Document) implementation.createDocument(null, "xml", null);
            Element raiz = document.createElement("obras");  // creamos el elemento raiz
            document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
            document.getDocumentElement().appendChild(raiz);  //pegamos la raiz al documento
            for (datos.Obra o : obras) {
                Element obra = document.createElement("obra"); //creamos un nuevo elemento
                raiz.appendChild(obra); //pegamos el elemento hijo a la raiz

                Element datos = document.createElement("datos");
                obra.appendChild(datos);

                Element id = document.createElement("id");
                Text tIdObra = document.createTextNode(o.getId().toString());
                id.appendChild(tIdObra);
                datos.appendChild(id);

                Element nombre = document.createElement("nombre");
                Text tNombreObra = document.createTextNode(o.getNombre().toUpperCase());
                nombre.appendChild(tNombreObra);
                datos.appendChild(nombre);

                Element codigo = document.createElement("codigo");
                Text tCodigoObra = document.createTextNode(o.getCodigo().toUpperCase());
                codigo.appendChild(tCodigoObra);
                datos.appendChild(codigo);

                Element monto = document.createElement("monto");
                Text tMontoObra = document.createTextNode(o.getMontoTotal().toString());
                monto.appendChild(tMontoObra);
                datos.appendChild(monto);

                Element fechaInicio = document.createElement("fechaInicio");
                SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
                Text tfechaInicio = document.createTextNode(sdf.format(o.getFechaInicioReal()));
                fechaInicio.appendChild(tfechaInicio);
                datos.appendChild(fechaInicio);

                Element fechaFin = document.createElement("fechaFin");
                Text tfechaFin = document.createTextNode(sdf.format(o.getFechaFinReal()));
                fechaFin.appendChild(tfechaFin);
                datos.appendChild(fechaFin);

                Element empresa = document.createElement("empresa");
                Element razonSocial = document.createElement("razonSocial");
                Text tRazon = document.createTextNode(o.getIdEmpresa().getRazonSocial());
                razonSocial.appendChild(tRazon);
                empresa.appendChild(razonSocial);
                Element responsable = document.createElement("responsable");
                Text tResponsable = document.createTextNode(o.getIdResponsable().getApellido() + ", " + o.getIdResponsable().getNombre());
                responsable.appendChild(tResponsable);
                empresa.appendChild(responsable);
                datos.appendChild(empresa);

                datos.Programacion ultimaProgramacion = null;
                int i = 0;
                List<datos.Programacion> programaciones = (List<Programacion>) o.getProgramacionCollection();
                for (datos.Programacion p : programaciones) {
                    if (i > 0 && p.getFecha().after(ultimaProgramacion.getFecha())) {
                        ultimaProgramacion = p;
                    } else if (i == 0) {
                        ultimaProgramacion = p;
                    }
                    i++;
                }

                Element estado = document.createElement("estado");
                Element retraso = document.createElement("retraso");
                String retr = "0.0";
                String alarm = "ROJO";
                if (ultimaProgramacion != null) {
                    retr = ultimaProgramacion.getRetraso().toString();
                    alarm = ultimaProgramacion.getAlerta();
                }
                Text tRetraso = document.createTextNode(retr);
                retraso.appendChild(tRetraso);
                estado.appendChild(retraso);
                Element alarma = document.createElement("alarma");
                Text tAlarma = document.createTextNode(alarm);
                alarma.appendChild(tAlarma);
                estado.appendChild(alarma);
                Element descripcionEstado = document.createElement("descripcion");
                Text tDescEstado = document.createTextNode(o.getIdEstado().getNombre());
                descripcionEstado.appendChild(tDescEstado);
                estado.appendChild(descripcionEstado);
                datos.appendChild(estado);
                GestorFotosLocal gestorFotos = lookupGestorFotosBean();
                if (gestorFotos != null) {
                    List<datos.Foto> listaFotos = (List<datos.Foto>) gestorFotos.ultimasNfotosPorObra(o.getId().intValue(),10);
                    //(List<datos.Foto>) o.getFotoCollection();
                    if (listaFotos != null) {
                        Element fotos = document.createElement("fotos");
                        for (datos.Foto f : listaFotos) {
                            Element foto = document.createElement("foto");

                            Element idFoto = document.createElement("id");
                            Text tIdFoto = document.createTextNode(f.getId().toString());
                            idFoto.appendChild(tIdFoto);
                            foto.appendChild(idFoto);

                            Element descFoto = document.createElement("descripcion");
                            String descripcionFoto = "SIN DESCRIPCION";
                            if (f.getDescripcion() != null) {
                                descripcionFoto = f.getDescripcion();
                            }
                            Text tDescFoto = document.createTextNode(descripcionFoto);
                            descFoto.appendChild(tDescFoto);
                            foto.appendChild(descFoto);

                            Element fechaFoto = document.createElement("fecha");
                            Text tFechaFoto = document.createTextNode(sdf.format(f.getFecha()));
                            fechaFoto.appendChild(tFechaFoto);
                            foto.appendChild(fechaFoto);

                            Element rutaFoto = document.createElement("ruta");
                            Text tRutaFoto = document.createTextNode(f.getRuta());
                            rutaFoto.appendChild(tRutaFoto);
                            foto.appendChild(rutaFoto);

                            Element rutaThumbnailFoto = document.createElement("rutaThumbnail");
                            Text tRutaThumbnailFoto = document.createTextNode(f.getRutaThumbnail());
                            rutaThumbnailFoto.appendChild(tRutaThumbnailFoto);
                            foto.appendChild(rutaThumbnailFoto);

                            fotos.appendChild(foto);
                        }
                        if (!listaFotos.isEmpty()) {
                            datos.appendChild(fotos);
                        }
                    }
                }

                Element geolocalizacion = document.createElement("geolocalizacion");

                Element longitud = document.createElement("longitud");
                Text tLong = document.createTextNode(o.getIdLocalizacion().getLongitud().toString());
                longitud.appendChild(tLong);
                geolocalizacion.appendChild(longitud);

                Element latitud = document.createElement("latitud");
                Text tLat = document.createTextNode(o.getIdLocalizacion().getLatitud().toString());
                latitud.appendChild(tLat);
                geolocalizacion.appendChild(latitud);

                Element pais = document.createElement("pais");
                Text tPais = document.createTextNode(o.getIdLocalizacion().getIdLocalidad().getIdDepartamento().getIdProvincia().getIdPais().getNombre());
                pais.appendChild(tPais);
                geolocalizacion.appendChild(pais);

                Element prov = document.createElement("provincia");
                Text tProv = document.createTextNode(o.getIdLocalizacion().getIdLocalidad().getIdDepartamento().getIdProvincia().getNombre());
                prov.appendChild(tProv);
                geolocalizacion.appendChild(prov);

                Element dpto = document.createElement("departamento");
                Text tDpto = document.createTextNode(o.getIdLocalizacion().getIdLocalidad().getIdDepartamento().getNombre());
                dpto.appendChild(tDpto);
                geolocalizacion.appendChild(dpto);

                Element loc = document.createElement("localidad");
                Text tLoc = document.createTextNode(o.getIdLocalizacion().getIdLocalidad().getNombre());
                loc.appendChild(tLoc);
                geolocalizacion.appendChild(loc);

                Element direccion = document.createElement("direccion");
                Text tDireccion = document.createTextNode(o.getIdLocalizacion().getCalle() + " " + o.getIdLocalizacion().getNumero() + " " + o.getIdLocalizacion().getBarrio());
                direccion.appendChild(tDireccion);
                geolocalizacion.appendChild(direccion);

                datos.appendChild(geolocalizacion);
            }

            Source source = new DOMSource(document);
            StringWriter writer = new StringWriter();

            Result result = new StreamResult(writer);

            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
            transformer.transform(source, result);
            return writer.toString();
        } catch (Exception e) {
            XmlMovil.log4jArchivo(e);
            return null;
        }
    }

    public static String fotosObraToXmlToString(List<datos.Foto> fotosObra) {
        try {
            DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
            DocumentBuilder builder = factory.newDocumentBuilder();
            DOMImplementation implementation = builder.getDOMImplementation();
            Document document = (Document) implementation.createDocument(null, "xml", null);
            Element raiz = document.createElement("fotos");  // creamos el elemento raiz
            document.setXmlVersion("1.0"); // asignamos la version de nuestro XML
            document.getDocumentElement().appendChild(raiz);  //pegamos la raiz al documento
            List<datos.Foto> listaFotos = fotosObra;
            if (listaFotos != null) {
                for (datos.Foto f : listaFotos) {
                    Element foto = document.createElement("foto");

                    Element idFoto = document.createElement("id");
                    Text tIdFoto = document.createTextNode(f.getId().toString());
                    idFoto.appendChild(tIdFoto);
                    foto.appendChild(idFoto);

                    Element descFoto = document.createElement("descripcion");
                    String descripcionFoto = "SIN DESCRIPCION";
                    if (f.getDescripcion() != null) {
                        descripcionFoto = f.getDescripcion();
                    }
                    Text tDescFoto = document.createTextNode(descripcionFoto);
                    descFoto.appendChild(tDescFoto);
                    foto.appendChild(descFoto);

                    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
                    Element fechaFoto = document.createElement("fecha");
                    Text tFechaFoto = document.createTextNode(sdf.format(f.getFecha()));
                    fechaFoto.appendChild(tFechaFoto);
                    foto.appendChild(fechaFoto);

                    Element rutaFoto = document.createElement("ruta");
                    Text tRutaFoto = document.createTextNode(f.getRuta());
                    rutaFoto.appendChild(tRutaFoto);
                    foto.appendChild(rutaFoto);

                    Element rutaThumbnailFoto = document.createElement("rutaThumbnail");
                    Text tRutaThumbnailFoto = document.createTextNode(f.getRutaThumbnail());
                    rutaThumbnailFoto.appendChild(tRutaThumbnailFoto);
                    foto.appendChild(rutaThumbnailFoto);

                    raiz.appendChild(foto);
                }
            }

            Source source = new DOMSource(document);
            StringWriter writer = new StringWriter();

            Result result = new StreamResult(writer);

            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            transformer.setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
            transformer.transform(source, result);
            return writer.toString();
        } catch (Exception e) {
            XmlMovil.log4jArchivo(e);
            return null;
        }
    }

    private static GestorFotosLocal lookupGestorFotosBean() {
        try {
            Context c = new InitialContext();
            return (GestorFotosLocal) c.lookup("java:comp/env/GestorFotosBean");
        } catch (Exception e) {
            XmlMovil.log4jArchivo(e);
            return null;
        }
    }
}
